# Makefile for drbd
#
# This file is part of DRBD by Philipp Reisner and Lars Ellenberg.
#
# Copyright (C) 2001-2008, LINBIT Information Technologies GmbH.
# Copyright (C) 2001-2008, Philipp Reisner <philipp.reisner@linbit.com>.
# Copyright (C) 2002-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
#
# drbd is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# drbd is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with drbd
# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
#

# TODO move some of the more cryptic bash scriptlets here into scripts/*
# and call those from here.	-- lge

# variables set by configure
GIT = @GIT@
LN_S = @LN_S@
PREFIX = @prefix@
RPMBUILD = @RPMBUILD@
SED = @SED@

# features enabled or disabled by configure
WITH_UDEV = @WITH_UDEV@
WITH_XEN = @WITH_XEN@
WITH_PACEMAKER = @WITH_PACEMAKER@
WITH_HEARTBEAT = @WITH_HEARTBEAT@
WITH_RGMANAGER = @WITH_RGMANAGER@
WITH_BASHCOMPLETION = @WITH_BASHCOMPLETION@
WITH_83_SUPPORT = @WITH_83_SUPPORT@
WITH_84_SUPPORT = @WITH_84_SUPPORT@
WITH_MANUAL = @WITH_MANUAL@
WITH_DRBDMON = @WITH_DRBDMON@
WITH_WINDRBD = @WITH_WINDRBD@
WITH_CLITEST = @WITH_CLITEST@

# for some reason some of the commands below only work correctly in bash,
# and not in e.g. dash. I'm too lazy to fix it to be compatible.
SHELL=/bin/bash

PNAME	:= drbd-utils
DOCKERREGISTRY := drbd.io
ARCH ?= amd64
ifneq ($(strip $(ARCH)),)
DOCKERREGISTRY := $(DOCKERREGISTRY)/$(ARCH)
endif
DOCKERREGPATH = $(DOCKERREGISTRY)/$(PNAME)
DOCKER_TAG ?= latest

TOOLS_DIRS  := user/shared user/v9 scripts
DOC_DIRS    := documentation/v9 documentation/ja/v9
ifeq ($(WITH_83_SUPPORT),yes)
TOOLS_DIRS  += user/v83
DOC_DIRS    += documentation/v83
endif
ifeq ($(WITH_84_SUPPORT),yes)
TOOLS_DIRS  += user/v84
DOC_DIRS    += documentation/v84 documentation/ja/v84
endif
ifeq ($(WITH_DRBDMON),yes)
TOOLS_DIRS  += user/drbdmon
endif
ifeq ($(WITH_WINDRBD),yes)
TOOLS_DIRS  += user/windrbd
endif

ifeq ($(WITH_MANUAL),yes)
SUBDIRS     = $(TOOLS_DIRS) $(DOC_DIRS)
else
SUBDIRS     = $(TOOLS_DIRS)
endif

all-yes := check-submods configure tools
all-$(WITH_MANUAL) += doc
all: $(all-yes)

.PHONY: all tools doc
tools:
	@ set -e; for i in $(TOOLS_DIRS); do $(MAKE) -C $$i ; done
	@ echo -e "\n\tUserland tools build was successful."

doc:
	$(MAKE) -C documentation/v9 doc
	$(MAKE) -C documentation/ja/v9 doc
ifeq ($(WITH_83_SUPPORT),yes)
	$(MAKE) -C documentation/v83 doc
endif
ifeq ($(WITH_84_SUPPORT),yes)
	$(MAKE) -C documentation/v84 doc
	$(MAKE) -C documentation/ja/v84 doc
endif

.PHONY: test testorfail
ifeq ($(WITH_CLITEST),yes)
test:
	$(MAKE) -C user/v9 test
ifeq ($(WITH_84_SUPPORT),yes)
	$(MAKE) -C user/v84 test
endif
else
test:
	$(warning "clitest" not found, test target disabled)
endif

ifeq ($(WITH_CLITEST),yes)
testorfail:
	$(MAKE) test
else
testorfail:
	$(error "clitest" not found, but tests are required for a release)
endif

# we cannot use 'git submodule foreach':
# foreach only works if submodule already checked out
.PHONY: check-submods
check-submods:
	@if test -d .git && test -s .gitmodules; then \
		for d in `grep "^\[submodule" .gitmodules | cut -f2 -d'"'`; do \
			if [ ! "`ls -A $$d`" ]; then \
				git submodule init; \
				git submodule update; \
				break; \
			fi; \
		done; \
	fi

.PHONY:	doc-clean install install-tools clean distclean extra-clean uninstall
doc-clean:
	$(MAKE) -C documentation/v9 doc-clean
	$(MAKE) -C documentation/ja/v9 doc-clean
ifeq ($(WITH_83_SUPPORT),yes)
	$(MAKE) -C documentation/v83 doc-clean
endif
ifeq ($(WITH_84_SUPPORT),yes)
	$(MAKE) -C documentation/v84 doc-clean
	$(MAKE) -C documentation/ja/v84 doc-clean
endif

install-yes := install-tools
install-$(WITH_MANUAL) += install-doc
install: $(install-yes)

install-tools:
	@ set -e; for i in $(patsubst drbd,,$(TOOLS_DIRS)); do $(MAKE) -C $$i install; done

install-doc:
	@ set -e; for i in $(patsubst drbd,,$(DOC_DIRS)); do $(MAKE) -C $$i install; done

.NOTPARALLEL clean:
	@ set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i clean; done
	rm -f *~
	rm -rf dist


distclean:
	@ set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i distclean; done
	rm -f *~ .filelist
	rm -rf dist
	rm -rf autom4te.cache
	rm -f config.log

EXTRA_CLEAN += Makefile user/Makefile user/v83/Makefile user/v84/Makefile user/v9/Makefile scripts/Makefile user/drbdmon/Makefile
EXTRA_CLEAN += documentation/Makefile documentation/v83/Makefile documentation/v84/Makefile documentation/v9/Makefile documentation/ja/v84/Makefile documentation/ja/v9/Makefile
EXTRA_CLEAN += user/shared/config.h drbd.spec
EXTRA_CLEAN += configure config.status
extra-clean: distclean
	rm -f $(EXTRA_CLEAN)

uninstall:
	@ set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i uninstall; done

.PHONY: check_VERSION
ifndef VERSION
check_VERSION:
	$(error environment variable VERSION is not set)
else
check_VERSION:
	true
endif


.PHONY: check_changelogs_up2date
check_changelogs_up2date: check_VERSION
	lbvers.py check \
		--base='$(BASE)' --build='$(BUILD)' --build-nr='$(BUILD_NR)' --pkg-nr='$(PKG_NR)' \
		--changelog=ChangeLog \
		--rpm-spec=drbd.spec.in --rpm-spec-changelog-only \
		--debian-changelog=debian/changelog \
		--configureac=configure.ac \
		--dockerfiles=Dockerfile --dockertoken=DRBD_UTILS_VERSION

.PHONY: .filelist
.filelist: check_VERSION
	@set -e ; submodules=`$(GIT) submodule foreach --quiet 'echo $$path'`; \
	$(GIT) ls-files | \
		grep -vxF -e "$$submodules" | \
		grep -v "^\.gitlab" | \
		sed '$(if $(PRESERVE_DEBIAN),,/^debian/d);s#^#$(PNAME)-$(VERSION)/#' | \
		grep -v "gitignore\|gitmodules" > .filelist
	@$(GIT) submodule foreach --quiet 'git ls-files | sed -e "s,^,$(PNAME)-$(VERSION)/$$path/,"' | \
		grep -v "gitignore\|gitmodules" >> .filelist
	@[ -s .filelist ] # assert there is something in .filelist now
	@find documentation -name "[^.]*.[578]" -o -name "*.html" | \
	sed "s/^/$(PNAME)-$(VERSION)\//"              >> .filelist ; \
	echo $(PNAME)-$(VERSION)/user/shared/drbd_buildtag.h >> .filelist ; \
	echo $(PNAME)-$(VERSION)/user/shared/config.h.in  >> .filelist ; \
	echo $(PNAME)-$(VERSION)/.filelist            >> .filelist ; \
	echo $(PNAME)-$(VERSION)/configure            >> .filelist ; \
	echo "./.filelist updated."

tools doc: check-submods

.PHONY: check_all_committed release debrelease tarball
check_all_committed:
	@$(if $(FORCE),-,)modified=`$(GIT) ls-files -m -t`; 		\
	if test -n "$$modified" ; then	\
		echo "$$modified";	\
	       	false;			\
	fi

release: testorfail
	$(MAKE) tarball

debrelease: testorfail
	$(MAKE) tarball PRESERVE_DEBIAN=1

configure.ac: ;
configure: configure.ac
	aclocal
	autoheader
	autoconf

config.status: configure
	@printf "\nYou need to call ./configure with appropriate arguments (again).\n\n"; exit 1

tarball: check_VERSION check-submods check_all_committed check_changelogs_up2date distclean doc configure .filelist
	rm -f drbd-utils-$(VERSION)
	$(LN_S) . drbd-utils-$(VERSION)
	for f in $$(<.filelist) ; do [ -e $$f ] && continue ; echo missing: $$f ; exit 1; done
	tar --owner=0 --group=0 -czf - -T .filelist > drbd-utils-$(VERSION).tar.gz
	rm drbd-utils-$(VERSION)

ifdef RPMBUILD
drbd.spec: drbd.spec.in configure
	./configure --enable-spec
endif

ifneq ($(FORCE),1)
dockerimage: debrelease
else
dockerimage:
endif
	docker build -t $(DOCKERREGPATH):$(DOCKER_TAG) $(EXTRA_DOCKER_BUILDARGS) .
	docker tag $(DOCKERREGPATH):$(DOCKER_TAG) $(DOCKERREGPATH):latest

.PHONY: dockerpath
dockerpath:
	@echo $(DOCKERREGPATH):latest $(DOCKERREGPATH):$(DOCKER_TAG)

Makefile.in: ;
Makefile: Makefile.in config.status
	./config.status Makefile
